﻿/****************************************************************************
** file: ImageRotate.h
** brief: 辅助函数，用于图像旋转。
** Copyright (C) LiYuan
** Author: LiYuan
** E-Mail: 18069211#qq(.)com
** Version 1.0.0
** Last modified: 2024.4.3
** Modified By: LiYuan
****************************************************************************/

#ifndef ROTATE_H
#define ROTATE_H

#include "opencv2/core/core.hpp"

/**
 * @brief imageRotateFixSize 旋转图像，输出图像与输入图像的长宽一致
 * @param image
 * @param degree 旋转角度，单位为 度，逆时针旋转为正方向。
 * @return
 */
cv::Mat imageRotateFixSize(const cv::Mat &src, double degree) noexcept;
cv::Mat imageRotateFixSize(const cv::Mat &src, double degree, cv::Point2f center) noexcept;

/**
 * @brief imageRotateFixSize 旋转图像，输出图像与输入图像的长宽一致
 * @param src
 * @param dst
 * @param degree 旋转角度，单位为 度，逆时针旋转为正方向。
 * @param center 指定旋转中心
 * @return
 */
bool imageRotateFixSize(const cv::Mat &src, double degree, cv::Mat &dst) noexcept;
bool imageRotateFixSize(const cv::Mat &src, double degree, cv::Point2f center, cv::Mat &dst) noexcept;
bool imageRotateFixSize(const cv::Mat &src, double degree, cv::Mat &dst, cv::Mat &mask) noexcept;
bool imageRotateFixSize(const cv::Mat &src, const cv::Mat &mask, double degree, cv::Mat &img_out, cv::Mat &mask_out) noexcept;

/**
 * @brief imageRotate2 旋转图像，会对输出图像的长宽进行调整，保证原始图像的各部分都在旋转后的图像中。
 * @param image
 * @param degree 旋转角度，单位为 度，逆时针旋转为正方向。
 * @return 返回旋转后的图像
 */
cv::Mat imageRotateAutoSize(const cv::Mat &src, double degree) noexcept;
bool imageRotateAutoSize(const cv::Mat &src, double degree, cv::Mat &dst);
bool imageRotateAutoSize(const cv::Mat &src, double degree, cv::Mat &dst, cv::Mat &mask);
bool imageRotateAutoSize(const cv::Mat &img, const cv::Mat &mask, double degree, cv::Mat &img_out, cv::Mat &mask_out) noexcept;


/**
 * @brief imageRotateFullSize 旋转图像，输出的图像尺寸可以保证任意角度旋转都不会有信息丢失
 * @param image
 * @param degree 旋转角度，单位为 度，逆时针旋转为正方向。
 * @return 返回旋转后的图像
 */
cv::Mat imageRotateFullSize(const cv::Mat &src, double degree) noexcept;
bool imageRotateFullSize(const cv::Mat &src, double degree, cv::Mat &dst);
bool imageRotateFullSize(const cv::Mat &src, double degree, cv::Mat &dst, cv::Mat &mask);
bool imageRotateFullSize(const cv::Mat &src, const cv::Mat &mask, double degree, cv::Mat &img_out, cv::Mat &mask_out) noexcept;

#endif // ROTATE_H
